//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include "CSceneManager.h"
//#include "CColladaMeshSceneNode.h"

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

class IFpsParticleSystemSceneNode;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

struct SFpsDefaultNodeEntry
{
	explicit SFpsDefaultNodeEntry(irr::scene::ISceneNode* n,
									const irr::video::SMaterial* material = 0,
									void* renderData = 0)
		: Node(n)
		, RenderData(renderData)
		, Material(material)
	{
	}

	bool operator < (const SFpsDefaultNodeEntry& other) const
	{
		const irr::video::SMaterial* const otherMat = other.Material;

		if (Material && otherMat)
		{
			if(Material->MaterialTypeParam2 == otherMat->MaterialTypeParam2)
			{
				return true;//*Material < *otherMat;
			}

			return Material->MaterialTypeParam2 > otherMat->MaterialTypeParam2;
		}

		return false;
	}

	irr::scene::ISceneNode*	Node;
	void*					RenderData;

	const irr::video::SMaterial* Material;
};

//struct FpsDefaultNodeEntry
//{
//	FpsDefaultNodeEntry(irr::scene::ISceneNode* n, int index = -1, 
//		void* texturePtr = 0, int priority = 0) :
//		Node(n), 
//		TextureValue(texturePtr), 
//		Priority(priority), 
//		meshBufferIndex(index), 
//	{
//		if(meshBufferIndex < 0)
//		{
//			if (n->getMaterialCount())
//			{
//				TextureValue	=	(n->getMaterial(0).getTexture(0));
//				Priority		=	(int)n->getMaterial(0).getMaterialTypeParam(2);
//			}
//		}
//	}
//
//	bool operator < (const FpsDefaultNodeEntry& other) const
//	{
//		if(Priority == other.Priority)
//		{
//			if(TextureValue == other.TextureValue)
//			{
//				if(GlobalMeshBuffer_PositionPtr == other.GlobalMeshBuffer_PositionPtr)
//				{
//					if(GlobalMeshBuffer_ColorPtr == other.GlobalMeshBuffer_ColorPtr)
//					{
//						return (GlobalMeshBuffer_ColorPtr < other.GlobalMeshBuffer_ColorPtr);
//					}
//					else
//					{
//						return (GlobalMeshBuffer_TexCoordPtr < other.GlobalMeshBuffer_TexCoordPtr);
//					}
//				}
//				else
//				{
//					return (GlobalMeshBuffer_PositionPtr < other.GlobalMeshBuffer_PositionPtr);
//				}
//			}
//			else
//			{
//				return (TextureValue < other.TextureValue);
//			}
//		}
//		else
//		{
//			return (Priority > other.Priority);
//		}
//	}
//
//	irr::scene::ISceneNode*		Node;
//	int							meshBufferIndex;
//
//	public:
//
//	void* TextureValue;
//	int Priority;
//	void* GlobalMeshBuffer_PositionPtr;
//	void* GlobalMeshBuffer_ColorPtr;
//	void* GlobalMeshBuffer_TexCoordPtr;
//};


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//class CFpsSceneManager : public irr::scene::CSceneManager
//{
//public:
//	CFpsSceneManager(irr::video::IVideoDriver* driver, irr::io::IFileSystem* fs,
//		irr::gui::ICursorControl* cursorControl, irr::scene::IMeshCache* cache = 0,
//		irr::gui::IGUIEnvironment *guiEnvironment = 0);
//
//	//! registers a node for rendering it at a specific time.
//	virtual irr::u32 registerNodeForRendering(irr::scene::ISceneNode* node,
//										const irr::video::SMaterial* material,// = 0,
//										 void* renderData,// = 0,
//										irr::scene::E_SCENE_NODE_RENDER_PASS pass= irr::scene::ESNRP_AUTOMATIC,
//										const irr::core::vector3df* absPos = NULL,
//										int layer = irr::u32(-1) >> 1
//										);
//
//	////! draws all scene nodes
//	virtual void drawAll(irr::scene::ISceneNode* root = NULL);
//
//	virtual void clearRenderLists();
//
//	//! Adds a particle system scene node.
//	virtual IFpsParticleSystemSceneNode* addFpsParticleSystemSceneNode(
//		bool withDefaultEmitter=true, irr::scene::ISceneNode* parent=0, irr::s32 id=-1,
//		const irr::core::vector3df& position = irr::core::vector3df(0,0,0),
//		const irr::core::vector3df& rotation = irr::core::vector3df(0,0,0),
//		const irr::core::vector3df& scale = irr::core::vector3df(1.0f, 1.0f, 1.0f));
//
//protected:
//
//	irr::core::array<SFpsDefaultNodeEntry>	SolidNodeList2;
//	//irr::core::array<STransparentNodeEntry>	TransparentNodeList2;
//
//	//irr::u16								m_aBatchingIndices[65536];
//	//int										m_nBatchingIndicesOff;
//
//	//bool RegisterMeshBuffers(irr::scene::ISceneNode* node);
//};

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
